/* Zatok - язык программирования текстовых игр
 * (С) 2010 - 2012 Меркулов Матвей Юрьевич
 * Код лицензирован под лицензией GNU LGPL
 * Вы можете прочитать текст лицензии по адресу:
 * http://www.gnu.org/copyleft/lesser.html
 * или прочитать русский перевод по адресу:
 * http://ru.wikisource.org/wiki/GNU_Lesser_General_Public_License
 */

package base.value;

import base.CObject;
import java.util.LinkedList;
import java.util.ListIterator;

public class CListValue extends CValue {
	public LinkedList<CValue> Values;



	@Override
	public CType GetType() {
		return CType.List;
	}

	
	
	@Override
	public boolean ToBoolean() {
		return Values.size() != 0;
	}

	

	@Override
	public String ToString() {
		String String = "";
		for( CValue Value : Values ) {
			if( !String.isEmpty() ) String += ", ";
			String += Value.ToString();
		}
		return "[ " + String + " ]";
	}



	@Override
	public CValue[] ToArray(){
		CValue[] NewValues = new CValue[ Values.size() ];
		Values.toArray( NewValues );
		return NewValues;
	}
	
	

	@Override
	public LinkedList<CValue> ToList() {
		return Values;
	}



	@Override
	public void EquateTo( CObject Obj ) {
		Values = Obj.ToList();
	}
	
	
	
	@Override
	public boolean IdenticalTo( CValue Obj ) {
		if( Obj.GetType() != CType.Array ) return false;
		LinkedList<CValue> List = Obj.ToList();
		if( List.size() != Values.size() ) return false;
		ListIterator<CValue> ValuesIterator = Values.listIterator();
		for( ListIterator<CValue> Iterator = List.listIterator(); Iterator.hasNext();  ) {
			if( !Iterator.next().IdenticalTo( ValuesIterator.next() ) ) return false;
		}
		return true;
	}
	
	
	
	@Override
	public CValue Clone() {
		CListValue ClonedValue = new CListValue();
		ClonedValue.Values = new LinkedList<CValue>();
		ClonedValue.Values.addAll( Values );
		return ClonedValue;
	}
	
	
	
	public static LinkedList<CValue> JoinLists( LinkedList<CValue> List0, LinkedList<CValue> List1 ) {
		LinkedList<CValue> NewList = new LinkedList<CValue>();
		for( CValue Value : List0 ) NewList.addLast( Value.Clone() );
		for( CValue Value : List1 ) NewList.addLast( Value.Clone() );
		return NewList;
	}
	
	
	
	
	public static CValue[] Slice( CValue[] Array, int FromIndex, int ToIndex ) {
		CValue[] NewArray = new CValue[ ToIndex - FromIndex + 1 ];
		for( int N = FromIndex; N <= ToIndex; N++ ) {
			NewArray[ N - FromIndex ] = Array[ N ].Clone();
		}
		return Array;
	}
	
	
	
	@Override
	public String toString() {
		return ToString();
	}
	
	
	
	@Override
	public void ReplaceValue( LinkedList<CValue> NewValues ) {
		Values = NewValues;
	}
	
	
	
	public static void RemoveIdentical( LinkedList<CValue> List, CValue Value ) {
		for( ListIterator<CValue> Iterator = List.listIterator(); Iterator.hasNext(); ) {
			if( Iterator.next().IdenticalTo( Value ) ) Iterator.remove();
		}
	}
}
